#ifndef _VL_RTSP_KMP__H_
#define _VL_RTSP_KMP__H_

#include "defs.h"
#include <map>

namespace VLRTSP {

/**
 * @Author: CimZzz
 * @Date: 2022-01-12 10:02:43
 * 
 * KMP 结点
 */
struct KMPNode {
	std::map<uint8_t, uint32_t> dpMap;
};

/**
 * @Author: CimZzz
 * @Date: 2022-01-12 09:57:27
 * 
 * KMP 算法
 * 比较耗费空间，建议在需要大量匹配同一字节数组场景时使用
 */
class KMP {

public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 09:59:22
	 * 
	 * 构造函数
	 * @param matchBuf 匹配字节数组
	 * @param length 字节数组长度
	 */
	explicit KMP(uint8_t* matchBuf, uint32_t length);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 11:21:31
	 * 
	 * 构造函数
	 * @param matchBuf 通过字符串构造
	 */
	explicit KMP(const char* matchBuf);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 10:07:23
	 * 
	 * 析构函数
	 */
	~KMP();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 10:08:41
	 * 
	 * 匹配字符串
	 * @param matchBuf 用来进行匹配的原始字节数组
	 * @param length 字节数组长度
	 * @return 如果匹配成功，返回原始字节数组中匹配字节数组起始下标
	 */
	int64_t matchBefore(uint8_t* matchBuf, uint32_t length);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 10:08:41
	 * 
	 * 匹配字符串
	 * @param matchBuf 用来进行匹配的原始字节数组
	 * @param length 字节数组长度
	 * @return 如果匹配成功，返回原始字节数组中匹配字节数组结束下标 + 1
	 */
	int64_t matchAfter(uint8_t* matchBuf, uint32_t length);

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 10:11:57
	 * 
	 * KMP 结点长度
	 */
	uint32_t length;
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 10:07:00
	 * 
	 * KMP 结点数组
	 */
	KMPNode* nodes;
};



}


#endif //_VL_RTSP_KMP__H_
